<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /* 
            基本类型和数据类型：
                -数据类型：分为五种基本类型和一种复杂类型，分别对应这个变量的基本类型和引用类型
                -内存中有两块储存区域，一个是栈区一个堆区
                -栈区保存的是基本类型值和对象类型的引用地址，堆区保存的是对象类型的值
                -变量是栈区一个内存区域的一个代号，保存的可能是一个基本类型值，也有可能是对象类型的地址值
                -我们不能操作堆区内容，而是通过栈区的地址去找到对应的对象操作
                

            基本类型值特点
                -基本类型：null undefined string number boolean (bigint symbol)
                -基本类型值都保存在栈区，可以直接通过变量获取到值进行操作
            基本类型特点
                -基本类型值是不可变的（不能改变自身只能直接替换）
                -基本类型值是不可添加属性和方法，添加了也获取不到。
                -基本类型的值比较是值的比较

            对象类型值特点
                -对象类型：object array function rejexp Math Date
            对象类型特点
                -对象类型值是可变的，可以扩展属性和方法
                对象保存在堆去，地址保存在栈区，变量保存的是栈区里边的地址
                变量和变量作比较是引用地址比较，而不是对象值比较
                
        */


        //基本类型值
        var a = 1; //栈区中有一个区域保存的是1，这个区域有一个代号叫做a
        console.log(a); //当我们访问a的时候，直接可以操作a中保存的值
        a = 2; //直接把a保存的值替换为了2

        var a = 'hello';
        a.index = 2; //给a添加一个自定义属性
        console.log(a.index); //undefined

        var b = 1;
        var d = 1;
        console.log(b === d); //直接拿到 b 和 d 保存的值进行比较得


        var obj = {};
        obj.name = "laowang";
        console.log(obj.name); //对象类型的值是可变的


        var obj = {}; //这个是一个对象 有一个地址值
        var obj2 = {}; //这个又是一个对象 是另外一个地址值
        console.log(obj === obj2); //引用类型的比较 是引用地址的比较 所以是false



        var obj3 = {}; //obj3保存的地址是0x111;
        var obj4 = obj3; //有一个新的变量obj4  把obj3的地址给了obj4一起保存
        console.log(obj3 === obj4);
        obj4.name = "laowang"; //因为obj3和obj4指向的是同一个对象，所以修改了obj3也是修改了obj4内对象的值
        console.log(obj3.name); //laowang


        //函数有两个身份：1.函数，用来调用执行某些代码   2.对象，被称作函数对象，也可以扩展属性和方法
        var fn = function () {

        }
        fn.study = "js";
        console.log(fn.study);


        //数组两个身份：1.数组，保存一些值  2.对象，被称作为数组对象，可以扩展属性和方法
        var arr = [];
        arr.study = "jquery";
        console.log(arr.study);
    </script>
</body>
</html>